#include <iostream>
#include "common.h"
#include <typeinfo>
#include <vector>
#include <deque>
#include <queue>

using namespace std;

namespace VECTOR_DAY20
{
    // vector容器大小:
    // 1 2 4 8 16 32
    // vector 容器大小的增长是以2的倍数

    void printVector(vector<int> & v)
    {
        cout << "v: [ ";
        for (auto i:v)
        {
            cout << i << " ";
        }

        cout << "]\n";

        cout << typeid(v).name() << endl;
    }

};


int main(int argc, char *argv[])
{


    {   
        __LOG__("vector的使用");
        using namespace VECTOR_DAY20;
        vector<int> v1;

        for (int i = 0;i < 17;i++)
            v1.push_back(i);
        printVector(v1);

        // size
        cout << v1[3] << endl;
        cout << v1.size() << endl;
        cout << v1.capacity() << endl;

        {
            //2.利用区间方式构造
            vector<int> v2(v1.begin(), v1.end());
            printVector(v2);

            //3.n个element方式构造
            vector<int> v3(10, 100);	//10个100
            printVector(v3);

            //4.拷贝构造
            vector<int> v4(v3);	
            printVector(v4);
        }
        {
            //直接赋值
            vector<int> v2;
            v2 = v1;

            printVector(v2);

            //assign赋值
            vector<int> v3;
            v3.assign(v1.begin(), v1.end());

            printVector(v3);

            //n个element赋值
            vector<int> v4;
            v4.assign(10, 100);
            printVector(v4);
        }

        {
            	vector<int> v;
                //尾插
                v.push_back(10);
                v.push_back(20);
                v.push_back(30);
                v.push_back(40);
                v.push_back(50);

                printVector(v);

                //尾删
                v.pop_back();
                printVector(v);

                //插入 - 提供迭代器
                v.insert(v.begin(), 100);
                printVector(v);

                //重载
                v.insert(v.begin(), 2, 100);
                printVector(v);

                //删除 - 提供迭代器
                v.erase(v.begin());
                printVector(v);

                //重载
                v.erase(v.begin(), v.end());		//相当于清空操作
                printVector(v);

                v.clear();		//清空容器中所有元素
                printVector(v);
        }

        {

            	vector<int> v;

                for (int i = 0; i < 10; ++i)
                {
                    v.push_back(i);
                }
                printVector(v);

                if (v.empty())
                {
                    cout << "vector容器为空" << endl;
                }
                else
                {
                    cout << "vector容器不为空" << endl;
                    cout << "vector容器的容量为：" << v.capacity() << endl;
                    cout << "vector容器的大小为：" << v.size()<< endl;
                }

                //重新指定大小 - 变大
            //	v.resize(15);
                v.resize(15,10);		//重载
                printVector(v);

                //重新指定大小 - 变小
                v.resize(5);
                printVector(v);		//超过部分将会删除
        }
        

        {
            // 双向队列
            deque<int> d1;
            deque<float> d2;
            
            for (int i = 0;i < 9;i++)
            {
                d1.push_front(i);
                d2.push_back(i);
            }

            cout << "下标法 d1: [ ";
            for (int i = 0;i < d1.size();i++)
            {
                cout << d1[i] << " ";
            }
            cout << "]\n";


            cout << "auto元素法 d2: [ ";
            // 直接取d2中的元素，因此i的类型为元素的类型
            for (auto i:d2)
            {
                cout << i << " ";
            }
            cout << "]\n";


            cout << "auto迭代法 d1: [ ";
            for (auto it = d1.begin();it < d1.end();it++)
            {
                cout << *it << " ";
            }
            cout << "]\n";


            cout << "类型迭代法 d1: [ ";
            for (std::deque<int>::iterator it = d1.begin();it < d1.end();++it)
            {
                cout << *it << " ";
            }
            cout << "]\n";
        }
        
        
        

        
    }

    


    return 0;
}